 #include <bits/stdc++.h> 
using namespace std;

typedef long long ll;    // 使用 long long 类型
const int maxn = 100001; // 最大圆的数量
const int INF = 1 << 27; // 无穷大

// 线段树相关变量
ll ans = 0;                          // 连通区域数量
int n;                               // 圆的数量
int tree[maxn << 4], col[maxn << 4]; // 线段树和懒惰标记

// 圆的结构体
struct Circle {
  ll left, right; // 左边界和右边界
};

// 比较函数，用于排序
bool cmp(Circle a, Circle b) {
  return (a.right == b.right) ? (a.left > b.left) : (a.right < b.right);
}

// 线段树的构建
void build(int l, int r, int rt) {
  col[rt] = 0;  // 初始化懒惰标记
  tree[rt] = 0; // 初始化树节点
  if (l == r)
    return;                     // 递归基
  int m = (l + r) >> 1;         // 中点
  build(l, m, rt << 1);         // 左子树
  build(m + 1, r, rt << 1 | 1); // 右子树
}

// 更新线段树
void update(int L, int R, int l, int r, int rt) {
  if (L <= l && r <= R) {
    col[rt] = 1;  // 懒惰标记
    tree[rt] = 1; // 更新树节点
    return;
  }
  // 推送懒惰标记
  if (col[rt]) {
    col[rt << 1] = col[rt << 1 | 1] = col[rt];
    tree[rt << 1] = tree[rt << 1 | 1] = 1;
    col[rt] = 0;
  }
  int m = (l + r) >> 1; // 中点
  if (L <= m)
    update(L, R, l, m, rt << 1); // 更新左子树
  if (R > m)
    update(L, R, m + 1, r, rt << 1 | 1);            // 更新右子树
  tree[rt] = min(tree[rt << 1], tree[rt << 1 | 1]); // 更新当前节点
}

// 查询线段树
int query(int L, int R, int l, int r, int rt) {
  if (tree[rt] == 1)
    return 1; // 如果当前节点为1，返回1
  if (L <= l && r <= R)
    return tree[rt];    // 完全覆盖
  int m = (l + r) >> 1; // 中点
  int ret = INF;        // 初始化返回值
  if (L <= m)
    ret = min(ret, query(L, R, l, m, rt << 1)); // 查询左子树
  if (R > m)
    ret = min(ret, query(L, R, m + 1, r, rt << 1 | 1)); // 查询右子树
  return ret;                                           // 返回结果
}

int main() {
  // 输入圆的数量
  scanf("%d", &n);
  vector<Circle> circles(n);
  vector<ll> boundaries; // 存储边界

  // 读取圆的圆心和半径
  for (int i = 0; i < n; i++) {
    ll x, r;
    scanf("%lld%lld", &x, &r);
    circles[i].left = x - r; // 计算左边界
    boundaries.push_back(circles[i].left);
    circles[i].right = x + r; // 计算右边界
    boundaries.push_back(circles[i].right);
  }

  // 排序边界
  sort(boundaries.begin(), boundaries.end());
  // 坐标压缩
  for (int i = 0; i < n; i++) {
    circles[i].left =
        (lower_bound(boundaries.begin(), boundaries.end(), circles[i].left) -
         boundaries.begin() + 1) *
        2;
    circles[i].right =
        (lower_bound(boundaries.begin(), boundaries.end(), circles[i].right) -
         boundaries.begin() + 1) *
        2;
  }

  // 根据右边界排序
  sort(circles.begin(), circles.end(), cmp);
  build(1, n * 4, 1); // 构建线段树

  // 遍历每个圆，更新和查询线段树
  for (int i = 0; i < n; i++) {
    if (query(circles[i].left, circles[i].right, 1, n * 4, 1) == 1) {
      ans += 2; // 新的连通区域
    } else {
      ans++;                                                  // 继续更新
      update(circles[i].left, circles[i].right, 1, 4 * n, 1); // 更新线段树
    }
  }

  // 输出结果
  printf("%lld\n", ans + 1); // 加1是因为初始状态也算作一个区域
  return 0;
}